package main

import (
	"encoding/gob"
	"log"
	"os"
)

var (
	//repoLastYoungestRevs 记录需要备份的仓库的最新的修订号
	//使用gob包缓存，下次执行程序的时候对比，只有修订号变化了才会执行备份
	repoPrevYoungestRevs = make(map[string]int)

	//shouldUploadCopies 需要上传到服务器的副本
	shouldUploadCopies = make([]string, 0, 5)
)

func main() {
	// 创建仓库的副本文件
	list, err := os.ReadDir(APP.RepositoriesDir)
	if err != nil {
		log.Panicln("[P]", err)
	}

	for _, info := range list {
		if !info.IsDir() {
			continue
		}

		repoRev, err := getYoungestRev(info.Name())
		if err != nil {
			log.Printf("[E] 获取 %s 的最新修订号失败: %s", info.Name(), err.Error())
		}
		repoPrevRev, ok := repoPrevYoungestRevs[info.Name()]
		if !ok {
			log.Printf("[I] %s 仓库的最新的修订号是 %d，没有上一次的记录，需要备份", info.Name(), repoRev)
		} else {
			if repoPrevRev == repoRev {
				log.Printf("[I] %s 仓库的最新的修订号是 %d，已经备份过，将跳过此次备份操作", info.Name(), repoRev)
				continue
			}
			log.Printf("[I] %s 仓库的最新的修订号是 %d，上一次备份的修订号是 %d，需要进行备份", info.Name(), repoRev, repoPrevRev)
		}

		dumpfile, err := backupSvnRepo(info.Name())
		if err != nil {
			log.Printf("[E] 导出 %s 仓库失败: %s", info.Name(), err.Error())
			continue
		}
		shouldUploadCopies = append(shouldUploadCopies, dumpfile)
		repoPrevYoungestRevs[info.Name()] = repoRev
		log.Printf("[I] 导出仓库 %s", dumpfile)
	}

	//	上传副本到服务器
	log.Printf("[I] 将备份上传至 %s 服务器...", APP.BakHost)
	if err := uploadCopies(shouldUploadCopies); err != nil {
		log.Panicf("[E] 上传副本到服务器失败: %s", err.Error())
	}
	log.Print("[I] 已完成上传")

	//将仓库修订号保存到文件
	f, err := os.Create("_prev_repos_reversions.list")
	if err != nil {
		log.Println("[E]", err)
	}
	defer f.Close()
	enc := gob.NewEncoder(f)
	if err := enc.Encode(repoPrevYoungestRevs); err != nil {
		log.Println("[E] 保存记录的仓库修订号失败", err)
	}
}
